from django.http import HttpResponse
from django.http import JsonResponse
from django.shortcuts import render

# Create your views here.
from django.views import View

'''
前端：
    拼接一个url。然后给 img。imig会发起请求
    url=http：//mp-meiduo-python.itmeiduo.net/image-codes/asdasd12123-12312-123ee-1123123121qsd/
    url=http://ip:port/image_codes/uuid/
后端：
    请求          接收路由中的uuid
    业务逻辑        生成图片验证码和图片二进制
    响应          返回图片二进制
    
    路由      GET     image_codes/uuid/
    步骤：
        1.接收路由中的uuid
        2.生成图片验证码和图片二进制
        3.通过redis数据库保存起来
        4.返回图片二进制
'''


class ImageCodeView(View):
    def get(self, requsest, uuid):
        # 1.接收路由中的uuid
        # 2.生成图片验证码和图片二进制
        from libs.captcha.captcha import captcha
        # text 是图片验证码
        # image 是图片二进制
        text, image = captcha.generate_captcha()

        # 3.通过redis数据库保存起来
        # 3.1 进行redis的连接
        from django_redis import get_redis_connection
        redis_cli = get_redis_connection('code')
        # 3.2指令操作
        # name，time，value
        redis_cli.setex(uuid, 100, text)
        # 4.返回图片二进制
        # 因为图片是二进制不能返回json数据
        # content_type
        # content_type的语法形式是：大类/小类
        # 图片：image/jpeg，image/gif，image/png
        return HttpResponse(image, content_type='image/jpeg')

    '''
    前端 
        当用户输入完 手机号 ，图片验证码之后，前端发送一个axios请求
        asdasdadas/asasddasdasd/asdasd
    后端
        请求：接受请求，获取请求参数（路由有手机号，用户的图片验证码和uuid在查询字符串）
        业务逻辑：验证参数，验证图片验证码，生成短信验证码，发送短信验证码
        响应：返回响应
            {‘code’：0，‘errmsg’：‘ok‘}
        步骤：
                1，获取请求参数
                2，验证参数
                3，验证图片验证码
                4，生成短信验证码
                5，保存短信验证码
                6，发送短信验证码
                7，返回响应
                需求>思路>步骤>代码
                debug 模式 就是调试模式
                debug + 断点配合使用 这个我们看到程序执行的过程
                
                添加断点 在函数体的第一行
    '''


class SmsCodeView(View):
    def get(self, request, moblie):
        # 1，获取请求参数
        image_code = request.GET.get('image_code')
        uuid = request.GET.get('image_code_id')
        # 2，验证参数
        if not all([image_code, uuid]):
            return JsonResponse({'code': 400, 'errmsg': '参数不全'})
        # 3，验证图片验证码
        # 3.1连接redis
        from django_redis import get_redis_connection
        redis_cli = get_redis_connection('code')
        # 3.2  获取redis数据
        redis_image_code = redis_cli.get(uuid)
        if redis_image_code is None:
            return JsonResponse({'code': 400, 'errmsg': '图片验证码已过期'})
        # 3.3 对比数据验证
        if redis_image_code.decode().lower() != image_code.lower():
            return JsonResponse({'code': 400, 'errmsg': '图片验证码错误'})
        send_flag = redis_cli.get('send_flag_%' % moblie)
        if send_flag is not None:
            return JsonResponse({'code': 400, 'errmsg': '不要频繁发送短信'})
        # 4，生成短信验证码
        from random import randint
        sms_code = '%06d' % randint(0, 999999)
        #管道
        popeline=redis_cli.pipeline()
        sms_code_client = request.POST.get('sms_code')
        # 判断短信验证码是否正确
        redis_conn = get_redis_connection('verify_code')
        sms_code_server = redis_conn.get('sms_%s' % moblie)
        # 判断短信验证码是否过期
        if not sms_code_server:
            return JsonResponse({'code': 400, 'errmsg': '验证码已过期'})
        # 对比验证码
        if redis_conn != sms_code_server.decode():
            return JsonResponse({'code': 400, 'errmsg': '验证码错误'})
        # 5，保存短信验证码
        redis_cli.setex(moblie, 300, sms_code)
        redis_cli.setex('send_flag_%' % moblie)
        # 6，发送短信验证码
        from libs.yuntongxun.sms import CCP
        CCP().send_template_sms(moblie, [sms_code, 5], 1)
        # 7，返回响应
        return JsonResponse({'code': 0, 'errmsg': 'ok'})
